﻿package com.eitb.nielsen{
	/**
	* Para usar esta clase se debe inicializar pasandole los parametros de agrupacion: tipo de contenido; y de titulo.
	* 	new NielsenVideoCall("GRUPO", "TITULO");
	*
	* posteriormente se debe inizializar el timer al comenzar la retransimisión para iniciar la secuencia de envio:
	*	nielsenVideoCall.initTimer(new Timer(1000,0));
	*
	* cuando la secuencia de video finalice se debe llamar al metodo stopTimer
	*	nielsenVideoCall.stopTimer();
	*
	* si fuera necesario se pueden utilizar los metodos pauseTimer() y resumeTimer() para controlar la ejecución de las llamadas.
	*
	* @author Andoni Díaz
	* @copyright EiTB
	*/
	
	import flash.net.*;
	import flash.external.*;
	import flash.utils.*;
	import flash.events.*;
	import com.eitb.rutas.*;

	/**
	* Tiene que ser capaz de realziar un ping a nielsen o de programar una llamada periodica
	*/
	public class NielsenVideoCall {
		public const MIN_30:Timer=new Timer(1800000,0);
		public const SEG_3:Timer=new Timer(3000,0);
		private static  const NIELSEN_RUTA:String="http://secure-uk.imrworldwide.com/cgi-bin/m";
		private static  const START:String="dav0-";
		private static  const PLAYING:String="dav1-";
		private static  const END:String="dav2-";
		private static  const CI:String="es-eitb-dav";
		private static  const C6:String="c03";
		private static  var START_TIME:Number;

		private var cg:String;
		private var tl:String;

		private var timer:Timer;
		private var done:Boolean=false;

		/**
		* cg es el canal de agrupacion
		* tl es el titulo identificativo con los prefijos dav0-, dav1- y dav2- si comienza, continua o termina
		* du es la duración (offset) desde que comenzo el evento.
		*/
		public function NielsenVideoCall(cg:String="",tl:String=""):void {
			this.cg=cg;
			this.tl=tl;
		}
		public function initTimer(timer:Timer):void {
			if (!done){
				this.doPing(NielsenVideoCall.START);
				this.timer=timer;
				this.timer.addEventListener("timer",this.doPing);
				this.timer.start();
				NielsenVideoCall.START_TIME=new Date().getTime();
			}
			done=true;
		}

		public function stopTimer():void {
			this.timer.removeEventListener("timer",this.doPing);
			this.doPing(NielsenVideoCall.END);
		}
		
		public function pauseTimer():void {
			this.timer.stop();
		}
		public function resumeTimer():void {
			this.timer.start();
		}

		public function doPing(instant:Object=NielsenVideoCall.PLAYING):void {
			trace(instant);
			var request:URLRequest=new URLRequest(NIELSEN_RUTA);
			var variables:URLVariables=new URLVariables  ;

			variables.ci=NielsenVideoCall.CI;
			variables.cg=this.cg;
			variables.tl=instant is TimerEvent? NielsenVideoCall.PLAYING.concat(this.tl):instant.concat(this.tl);
			if (instant != NielsenVideoCall.START) {
				variables.du=new Number((new Date().getTime() - NielsenVideoCall.START_TIME) / 1000).toString();
			}
			variables.c6=NielsenVideoCall.C6;
			variables.rp=Rutas.DOMINIO;
			variables.rnd=Math.random();
			
			request.data=unescape(variables.toString()); // por petición de Nielsen
			this.callNielsen(request);
		}
		
		private function callNielsen(request:URLRequest):void {
			var loader:URLLoader=new URLLoader  ;

//			request.method=URLRequestMethod.POST;
			request.method=URLRequestMethod.GET; // por petición de Nielsen
			
			// comentados por problemas con nuestros miles de proxys
//			request.requestHeaders.push(new URLRequestHeader("cache-control","no-cache"));
//			request.requestHeaders.push(new URLRequestHeader("expires","Thu, 01 Dec 2000 16:00:00 GMT"));
//			request.requestHeaders.push(new URLRequestHeader("pragma","no-cache"));

			try {
				loader.load(request);
				trace('onStreamPing -- llamada a Nielsen');
			} catch (error:Error) {
				trace('onStreamPing -- FALLO llamada Nielsen');
			}
		}
	}
}
